home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / jpi / jpiserve.bas < prev    next >
BASIC Source File  |  1998-01-11  |  7KB  |  239 lines

  1. Attribute VB_Name = "Servermodule"
  2. Global Const VERSION = "V2.0"
  3. Type KillCounts
  4.   BuildingsDestroyed As Integer
  5.   UnitsDestroyed As Integer
  6.   PeopleKilled As Integer
  7.   BuildingsSacrificed As Integer
  8.   UnitsSacrificed As Integer
  9.   PeopleSacrificed As Integer
  10. End Type
  11. Const MAXDATALINES = 30
  12. Type Playrs
  13.   Active As Boolean
  14.   IncomingDataCodes(MAXDATALINES) As Integer
  15.   IncomingData(MAXDATALINES) As String
  16.   DataLines As Integer
  17.   NickName As String
  18.   InGame As Boolean
  19.   KillTally As KillCounts
  20.   
  21.   OutGoingDataCodes(MAXDATALINES) As Integer
  22.   OutGoingData(100) As String
  23.   OutGoingLines As Integer
  24. End Type
  25. Global Const MAXPLAYERS = 10
  26. Global Players(MAXPLAYERS) As Playrs
  27. Global PlayersLoggedOn As Integer
  28. Type TimeObj
  29.   Hour As Integer
  30.   Minute As Integer
  31.   Second As Integer
  32.   Day As Integer
  33.   Month As Integer
  34.   Year As Integer
  35. End Type
  36. Type OldPeople
  37.   EntryActive As Boolean
  38.   NickName As String
  39.   KillTally As KillCounts
  40. End Type
  41. Global Const MAXSCORES = 100
  42. Type ServerDat
  43.   ScoreHistory(MAXSCORES) As OldPeople
  44.   LocalIP As String
  45.   LocalPort As Integer
  46.   Active As Boolean
  47.   ServerStartTime As TimeObj
  48.   MotD As String
  49.   SysopName As String
  50.   LogOns As Integer
  51. End Type
  52. Global ServerData As ServerDat
  53. Type GameNfo
  54.   MapName As String
  55.   UsingPatch As Boolean
  56.   PatchName As String
  57.   GameTimer As Integer
  58.   GameTimeLimit As Boolean
  59.   GameLength As Integer 'For time-limited games
  60. End Type
  61. Global GameInfo As GameNfo
  62. Global Const DefaultPort = 4000
  63. Sub StartServer(PortNum)
  64. 'On Error Resume Next
  65. Form1.AnswerSock.LocalPort = PortNum
  66. Form1.AnswerSock.Listen
  67. End Sub
  68. Sub Delay(timedel)
  69. strttime = Timer
  70. Do
  71.   DoEvents
  72.   If Timer > strttime + timedel Then Exit Do
  73. Loop
  74. End Sub
  75. Sub StartupPlayer(Index)
  76. ServerData.MotD = "Welcome to the JPI game     server " & VERSION & ".  if you're a wuss,   get out of here."
  77. Call SendData(Index, CODE_ASSIGNPLAYERINDEX, Index)
  78. Call WaitForIncomingData(Index)
  79. If Players(Index).IncomingDataCodes(1) = CODE_ASSIGNPLAYERNICKNAME Then
  80.   nick = Players(Index).IncomingData(1)
  81.   NotFound = True
  82.   For i = 1 To PlayersLoggedOn
  83.     If PlayerVerify(i) = True Then
  84.       If Players(i).NickName = nick Then
  85.         NotFound = False
  86.       End If
  87.     End If
  88.   Next i
  89.   If NotFound = True Then
  90.     Players(Index).NickName = nick
  91.     Call SendData(Index, CODE_USERACCEPTED, WELCOMEMESSAGE)
  92.     Call GetRidOfDataLine(Index)
  93.   Else
  94.     Call SendData(Index, CODE_USERLOGINFAILED, "Nickname In Use")
  95.     DoEvents
  96.     Call KillUser(Index)
  97.   End If
  98. End If
  99. 'give the client the game info HERE
  100. DoEvents
  101. Call SendData(Index, CODE_MESSAGE, "JPI Server V1.0")
  102. DoEvents
  103. Call SendData(Index, CODE_MESSAGE, "SYSOP: " & ServerData.SysopName)
  104. DoEvents
  105. Call SendData(Index, CODE_MESSAGE, "MOTD: " & ServerData.MotD)
  106. DoEvents
  107. Call SendData(Index, CODE_MESSAGE, "PLAYERS LOGGED ON: " & PlayersLoggedOn)
  108. DoEvents
  109. Players(Index).InGame = True
  110. Call BroadcastEvent(CODE_MESSAGE, Players(Index).NickName & " " & "logged on.")
  111. onserv = 0
  112. For i = 1 To PlayersLoggedOn
  113.   If Players(i).Active = True Then
  114.     onserv = onserv + 1
  115.   End If
  116. Next i
  117. Form1.Text2.Text = onserv
  118. End Sub
  119. Sub KillServer()
  120. For i = 1 To PlayersLoggedOn
  121.   If PlayerVerify(i) = True Then
  122.     Call SendData(i, CODE_SERVERSHUTDOWN, "Shutting down...")
  123.     Call KillUser(i)
  124.     DoEvents
  125.   End If
  126. Next i
  127. PlayersLoggedOn = 0
  128. DoEvents
  129. End Sub
  130. Sub SendData(PlayerIndex, DataCode, DataString)
  131. On Error Resume Next
  132. Form1.ServerSock(PlayerIndex).SendData DataCode & DataString & "|"
  133. End Sub
  134. Sub WaitForIncomingData(Index)
  135. Do
  136.   DoEvents
  137.   If Players(Index).DataLines > 0 Then
  138.     Exit Do
  139.   End If
  140. Loop
  141. End Sub
  142. Sub GetRidOfDataLine(Index)
  143. Players(Index).DataLines = Players(Index).DataLines - 1
  144. For i = 1 To Players(Index).DataLines
  145.   Players(Index).IncomingData(i) = Players(Index).IncomingData(i + 1)
  146.   Players(Index).IncomingDataCodes(i) = Players(Index).IncomingDataCodes(i + 1)
  147. Next i
  148. End Sub
  149. Sub KillUser(Index)
  150. On Error Resume Next
  151. Players(Index).Active = False
  152. Players(Index).InGame = False
  153. Players(Index).DataLines = 0
  154. Players(Index).OutGoingLines = 0
  155. Form1.ServerSock(Index).Close
  156. Unload Form1.ServerSock(Index)
  157. Load Form1.ServerSock(Index)
  158. For i = 1 To PlayersLoggedOn
  159.   If Players(i).Active = True Then
  160.     mnum = i
  161.   End If
  162. Next i
  163. PlayersLoggedOn = mnum
  164. 'make killall player's objects here
  165.  
  166. Call BroadcastEvent(CODE_MESSAGE, Players(Index).NickName & " " & "left the game.")
  167.  
  168. Call BroadcastEvent(CODE_SUICIDE, Index)
  169.  
  170. Call BroadcastEvent(CODE_PLAYERKILLEDFROMSERVER, Index)
  171. onserv = 0
  172. For i = 1 To PlayersLoggedOn
  173.   If Players(i).Active = True Then
  174.     onserv = onserv + 1
  175.   End If
  176. Next i
  177. Form1.Text2.Text = onserv
  178. End Sub
  179. Sub BroadcastEvent(DataCode, DataString)
  180. For i = 1 To PlayersLoggedOn
  181.   If PlayerVerify(i) = True Then
  182.     Players(i).OutGoingLines = Players(i).OutGoingLines + 1
  183.     Players(i).OutGoingDataCodes(Players(i).OutGoingLines) = DataCode
  184.     Players(i).OutGoingData(Players(i).OutGoingLines) = DataString
  185.   End If
  186. Next i
  187. End Sub
  188. Function PlayerVerify(i)
  189. If Players(i).Active = True Then
  190.   If Players(i).InGame = True Then
  191.     PlayerVerify = True
  192.   End If
  193. End If
  194. End Function
  195. Sub SendDataToPlayer(Index)
  196. For i = 1 To Players(Index).OutGoingLines
  197.   Call SendData(Index, Players(Index).OutGoingDataCodes(i), Players(Index).OutGoingData(i))
  198.   DoEvents
  199. Next i
  200. Players(Index).OutGoingLines = 0
  201. DoEvents
  202. End Sub
  203. Sub HandlePlayerData(Index)
  204. For i = 1 To Players(Index).DataLines
  205.   Select Case Players(Index).IncomingDataCodes(i)
  206.   Case CODE_JOININGGAME
  207.     Call BroadcastEvent(CODE_MESSAGE, Players(Index).NickName & " " & "joined the game.")
  208.   Case CODE_MESSAGE
  209.     Call BroadcastEvent(CODE_MESSAGE, Players(Index).NickName & ": " & Players(Index).IncomingData(i))
  210.   Case CODE_LOGOFF
  211.     Call KillUser(Index)
  212.     Exit Sub
  213.   Case CODE_EVENT
  214.     Call BroadcastEvent(CODE_EVENT, Players(Index).IncomingData(i))
  215.   End Select
  216. Next i
  217. Players(Index).DataLines = 0
  218. End Sub
  219. Sub Rotation()
  220. Do
  221.   DoEvents
  222.   For i = 1 To PlayersLoggedOn
  223.     If PlayerVerify(i) = True Then Call HandlePlayerData(i)
  224.     If PlayerVerify(i) = True Then Call SendDataToPlayer(i)
  225.   Next i
  226. Loop
  227. End Sub
  228. Sub BreakDownMessage(MessageText, Index)
  229. messagetxt = MessageText
  230. Do
  231.   Players(Index).DataLines = Players(Index).DataLines + 1
  232.   Players(Index).IncomingDataCodes(Players(Index).DataLines) = Left$(messagetxt, 4)
  233.   Players(Index).IncomingData(Players(Index).DataLines) = Mid$(messagetxt, 5, InStr(1, messagetxt, "|") - 5)
  234.   messagetxt = Right$(messagetxt, Len(messagetxt) - InStr(1, messagetxt, "|"))
  235.   If messagetxt = "" Then Exit Do
  236. Loop
  237. End Sub
  238.  
  239.